package org.langqiao.experiment.experiment7;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class ClockView extends JPanel implements Runnable {

	Thread newThread;
	
	public static int RADIUS = 70;
    //定义中钟面这个圆的圆心
	public static int centerX = 100;//定义圆心的横坐标
	public static int centerY = 85;//定义圆心的纵坐标
	
	public int hr, min, sec;
	public int[] xPoint = new int[4]; //指针的4个坐标的数组
	public int[] yPoint = new int[4];
	public double hrAlpha, minAlpha, secAlpha, theta;//定义时针、分针、秒针、？的开端，theta希腊字母的第八个字，时间递耗值

	private JTextField timeZone;
	public void start() {
		newThread = new Thread(this);
		newThread.start();
	}
	
	public void stop() {
		newThread = null;
	}
	
	/**
	 * Constructor
	 */
	public void paint(Graphics g) {
		super.paint(g);
		
		
		g.setColor(Color.LIGHT_GRAY);
		g.drawRoundRect(0, 0, 196, 211, 8, 8);//画圆角矩形RoundRect
		
		g.setColor(Color.YELLOW);
		g.drawRoundRect(2, 2, 169, 199, 8, 8);
			
		g.setColor(Color.BLACK);
		g.fillRoundRect(1,1, 195, 210, 8, 8);//填充
		//*******************************************
//		画窗口框架左侧"时间面板”
		g.setColor(Color.GREEN);
		g.drawRoundRect(15, 10, 160, 190, 8, 8);//画钟盘外面大的的边框，设置颜色为绿色		
		
		
		g.setColor(Color.GREEN);//钟盘左上角的“时间”的边框
		g.drawRoundRect(26, 3, 46, 16, 3, 3);
		g.fillRoundRect(26, 3, 46, 16, 3, 3);
		
		g.setColor(Color.RED);//这里是设置字体的颜色
		g.setFont(new Font("宋体", Font.PLAIN, 15));//设置字体为宋体，Font.PLAIN是一个普通系统默认的字体，大小为15
		g.drawString("时 间", 30, 18);
//		**********************************************
/*		画窗口框架右侧“日期的面板”
		
		g.setColor(Color.GREEN);
		g.drawRoundRect(200, 10, 170, 200, 8, 8);		

	    g.drawRoundRect(210,3,46,16,3,3);
	    g.fillRoundRect(210, 3, 46, 16, 3, 3);
		g.setColor(Color.red);
		
		g.setFont(new Font("宋体", Font.PLAIN, 15));
     	g.drawString("日期", 215,18);	*/
		
		//画出刻度
		double minuteAlpha  = Math.PI/30.0;//double minuteAlpha=2*Math.PI/60.0,一个钟面被画为了60分钟60 份，1份的弧度就为2*Math*PI/60
		int count = 0;		
		for(double alpha=0; alpha<2.0*Math.PI; alpha+=minuteAlpha) {//minuteAlpha画出分针的刻度，alpha定义的0~2π的弧度
			int tX = (int)(centerX+RADIUS*0.9*Math.cos(alpha));//定义钟面上刻度的横坐标,alpha为角的弧度，这个0.9是用来控制这个钟面的大小
			int tY = (int)(centerY-RADIUS*0.9*Math.sin(alpha));//定义钟面上刻度的纵坐标
			if(count%5 == 0) {
				g.setColor(Color.CYAN);//画出表示1,2,3,4,5,6,7,8,9,10,11,12这12个刻度,设置颜色为蓝绿色
				g.fill3DRect(tX, tY, 3, 3, false);//在坐标为tX、tY处填充一个宽度和高度都为3，凹入显示的矩形
			}else {
				g.setColor(Color.DARK_GRAY);//画出钟面上其他的小刻度
				g.fill3DRect(tX, tY, 2, 2, false);//在坐标为tX、tY处填充一个宽度和高度都为2，凹入显示的矩形
			}
			count++;
		}
		
		//画出时针
		g.setColor(Color.gray);
		drawPointer(g, centerX+2, centerY+2, (int)(RADIUS*0.75), hrAlpha);
		//g.drawLine(centerX+2,centerY+2,(int)(centerX+(int)(RADIUS*0.75)*Math.sin(hrAlpha)),(int)(centerY-(int)(RADIUS*0.75)*Math.cos(hrAlpha)));
    	g.setColor(Color.cyan);
		drawPointer(g, centerX, centerY, (int)(RADIUS*0.75), hrAlpha);//画了两条线，以使时针看的明显粗一些

			
		//画出分针
		g.setColor(Color.gray);
		drawPointer(g, centerX+2, centerY+2, (int)(RADIUS*0.83), minAlpha);
		g.setColor(Color.CYAN);//cyan蓝绿色,分针的
		drawPointer(g, centerX, centerY, (int)(RADIUS*0.83), minAlpha);

		
		//画出秒针
		g.setColor(Color.cyan);
		g.drawLine( centerX,centerY,
				(int)(centerX+(int)(RADIUS*0.79)*Math.sin(secAlpha)),
				(int)(centerY-(int)(RADIUS*0.79)*Math.cos(secAlpha))
		);//画直线，在两点之间画直线
		
		
	   	//用一个矩形框显示出时间   	   
		g.drawRect(40, 160, 120, 20);//画出矩形，在坐标点(40,60),width为120，高度为20
		g.setColor(Color.yellow);
		g.fill3DRect(41, 161, 120, 20, true);
		g.setColor(Color.DARK_GRAY);
		g.setFont(new Font("Arial", Font.BOLD, 12));//Font.BOLD是粗体，Arial是宋体，在win计算机上显示的是比宋体大下小一点点
 		
		//获取系统当前的时间
		Date timeNow = new Date();
		g.drawString(timeNow.toLocaleString(), 46,175);
	}
	
	/**3
	 * 得到系统的时间
	 * @return
	 */
	/*public Date getDate() {不用在定义Date方法了，系统自动封装了，可以自动调用
		Date timeNow = new Date();
		return timeNow;
	}*/
	
	/**
	 * 刷新图层
	 */
	public void update(Graphics g) {//更新图象，重画，刷新图形
		paint(g);
	}
	
	/**
	 * 画出一个帧的图像
	 */
//	控制让钟的时分秒三个指针运动起来,使时分秒三个指针一起运动起来，是实现时钟的动态性
	public void run() {
		while(newThread != null) {
			repaint();
			try {
				Thread.sleep(50);
			} catch(InterruptedException e) {}
		
			Date timeNow = new Date();
			int hours  = timeNow.getHours();
			int minutes = timeNow.getMinutes();
			int seconds = timeNow.getSeconds();
			hr  = hours%12;//时间是24小时制，换算成为12小时制,一般的钟面上都是12个小时，12小时制
			min = minutes;
			sec = seconds;
			
			theta = Math.PI/6.0/20.0;
			
			hrAlpha  = (double)(hr*3600 + min*60 + sec)
				/(12.0*3600.0)*2.0*Math.PI;//一个小时是由3600秒，时针走一圈是12*3600秒
			minAlpha = (double)(min*60 + sec)/3600.0*2.0*Math.PI;//分针走一圈是3600秒一个小时
			secAlpha = (double)sec/60.0 *2.0*Math.PI;//秒针走一圈是60秒
			
		}		
	}
	
	/**
	 * 画指针的方法
	 * @param g
	 * @param x
	 * @param y
	 * @param len
	 * @param theta
	 */
	private void drawPointer(Graphics g, int x, int y, //定义了一个drawPointer方法,画一个多边形，表示时针和分针，而秒针是画线
			int len, double theta) {
		
		xPoint[0] = (int)(x+len*0.3*Math.sin(theta-Math.PI));
		yPoint[0] = (int)(y-len*0.3*Math.cos(theta-Math.PI));
		xPoint[1] = (int)(xPoint[0]+len*0.3*Math.sin
				(theta-(double)(10.0/180)*Math.PI));
		yPoint[1] = (int)(yPoint[0]-len*0.3*Math.cos
				(theta-(double)(10.0/180)*Math.PI));
		xPoint[2] = (int)(xPoint[0]+len * Math.sin(theta));
		yPoint[2] = (int)(yPoint[0]-len * Math.cos(theta));
		xPoint[3] = (int)(xPoint[0]+len*0.3*Math.sin
				(theta+(double)(10.0/180)*Math.PI));
		yPoint[3] = (int)(yPoint[0]-len*0.3*Math.cos
				(theta+(double)(10.0/180)*Math.PI));

		g.fillPolygon(xPoint, yPoint, 4);//Polyon多角形，多边形		
	}
	

}
class Calendar extends JPanel implements ActionListener
{
	public static final String HOUR_OF_DAY=null;
	//定义两个组合框，一个是显示月，一个用来显示年
	JComboBox Month=new JComboBox();
	JComboBox Year=new JComboBox();
	//在定义两个标签，用来显示“年”和“月”
	JLabel Month_1=new JLabel("月");
	JLabel Year_1=new JLabel("年");
	Date now_date=new Date();//获取系统当前时间
	JLabel[] Label_day=new JLabel[49];//定义比表示天数标签的数组 
	int now_year=now_date.getYear()+1900;//获取系统的当前的年份
	int now_month=now_date.getMonth();//获取系统当前的月份
	boolean bool=false;
	String year_int=null;
	int month_int;
	//又定义了两个面板
	JPanel pane_ym=new JPanel();
	JPanel pane_day=new JPanel();
	//timeAndDate.add(pane_ym);
	//timeAndDate.add(pane_day);
	Calendar()//构造方法
	{
		super();
		//设定年月
		//CalendarView cv=new CalendarView();
		for(int i=now_year-10;i<=now_year+20;i++)
		{
			Year.addItem(i+"");//在年组合框中添加年份
		}
		for(int i=1;i<=12;i++)
		{
			Month.addItem(i+"");//在月组合框中添加月份
		}
		Year.setSelectedIndex(10);//让当前的年组合框选中2011年,从2001年开始，setSelectedIndex()是从0开始的10，就是从2001年开始的第11个年头
		pane_ym.add(new JLabel("	"));
		pane_ym.add(Year);//在面板上添加Year组合框
		pane_ym.add(Year_1);//在面板上添加Year_1标签
		Month.setSelectedIndex(now_month);
		pane_ym.add(Month);//在面板上添加Month月组合框
		pane_ym.add(Month_1);//在面板上添加标签Month_1标签
		pane_ym.add(new JLabel("	"));
		Year.addActionListener(this);
		Month.addActionListener(this);
		//初始化日期并绘制
		pane_day.setLayout(new GridLayout(7,7,10,10));//7行7列，组件间水平和垂直间距都为10
		for(int i=0;i<49;i++)//在pane_day面板上显示出每个月的天数
		{
			Label_day[i]=new JLabel(" ");
			pane_day.add(Label_day[i]);
		}
		this.setDay();
		this.setLayout(new BorderLayout());//采用边布局管理器
		this.add(pane_ym,BorderLayout.NORTH);
		this.add(pane_day,BorderLayout.CENTER);
		pane_ym.setBackground(Color.LIGHT_GRAY);
		pane_day.setBackground(Color.LIGHT_GRAY);
		
	}
	void setDay()
	{
		if(bool)
		{
			year_int=now_year+"";
			month_int=now_month;
		}
		else
		{
			year_int=Year.getSelectedItem().toString();
			month_int=Month.getSelectedIndex();
		}
		int year_sel=Integer.parseInt(year_int)-1900;//获得年份值
		Date dt=new Date(year_sel,month_int,1);//构造一个星期
	    GregorianCalendar c=new GregorianCalendar();//创建一个GregorianCalendar实例对象
	    c.setTime(dt);
	    String week[]={"日","一","二","三","四","五","六"};
	    int day=0;
	    int day_week=0;
	    for(int i=0;i<7;i++)
	    {
	        Label_day[i].setText(week[i]);
	    }
	    //月份
	    if(month_int==0||month_int==2||month_int==4||month_int==6||month_int==7||month_int==9||month_int==11)
	    {
	    	day=31;
	    }
	    else if(month_int==3||month_int==5||month_int==8||month_int==10)
	    {
	    	day=30;
	    }
	    else
	    {
	    	if(c.isLeapYear(year_sel))
	    	{
	    		day=29;
	    	}
	    	else
	    	{
	    		day=28;
	    	}
	    }
	    day_week=7+dt.getDay();
	    int count=1;
	    for(int i=day_week;i<day_week+day;i++,count++)
	    {
	    	if(i%7==0||i==13||i==20||i==27||i==34||i==41||i==48)
	    	{
	    		if(i==day_week+now_date.getDate()-1)
	    		{
	    			Label_day[i].setForeground(Color.blue);
	    			Label_day[i].setText(count+"");
	    		}
	    		else
	    		{
	    			Label_day[i].setForeground(Color.red);
	    			Label_day[i].setText(count+"");
	    		}
	    	}
	    	else
	    	{
	    		if(i==day_week+now_date.getDate()-1)
	    		{
	    			Label_day[i].setForeground(Color.blue);
	    			Label_day[i].setText(count+"");
	    		}
	    		else
	    		{
	    			Label_day[i].setForeground(Color.black);
	    			Label_day[i].setText(count+"");
	    		}
	    	}
	    }
	    if(day_week==0)
	    {
	    	for(int i=day;i<49;i++)
	    	{
	    		Label_day[i].setText(" ");
	    	}
	    }
	    else
	    {
	    	for(int i=7;i<day_week;i++)
	    	{
	    		Label_day[i].setText(" ");
	    	}
	    }
	    
	}
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource()==Month||e.getSource()==Year)
		{
			bool=false;
			this.setDay();
		}
	}
}
